//
//  XKUserAccountViewModel.swift
//  XKWeibo
//
//  Created by 小k on 15/11/8.
//  Copyright © 2015年 小k. All rights reserved.
//

import Foundation


class XKUserAccountViewModel {
    
    /// 用户账户的单例
    static let sharedUserAccount = XKUserAccountViewModel()
    
    /// 用户模型
    var account:XKUserAccount?
    
    /// 返回有效的 token
    var accessToken: String? {
        
        // 如果 token 没有过期，返回 account.中的 token 属性
        if !isExpired {
            return account?.access_token
        }
        return nil
    }
    
    /// 用户登录标记
     var userLogin:Bool {
        return account?.access_token != nil && !isExpired
    }
    
    /// 头像地址
    var headUrl: NSURL {
        print(account)
        return NSURL(string: account?.avatar_large ?? "")!
    }
    
    /// 归档保存文档的路径  ---> 计算形属性
    private var accountPath:String {
        var path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last!
        path = (path as NSString).stringByAppendingPathComponent("account.plist")
        
        return path
    }
    
    /// 判断时间是否过期
    private var isExpired:Bool {
        print(account?.expiresDate)

        if account?.expiresDate?.compare(NSDate()) == NSComparisonResult.OrderedDescending{
            print("没有过期")
            return false
        }
        print("过期了")
        return true
    }
    
    // MARK: - 构造函数--加载用户信息 解档
    private init() {
        
        // 从沙河中 加载用户信息
        account = NSKeyedUnarchiver.unarchiveObjectWithFile(accountPath) as? XKUserAccount
        
        // 验证时间判断是否起效
//           userAccount?.expiresDate = NSDate(timeIntervalSinceNow: -3600)
        
        // 如果时间过期, 清空所有数据
        if isExpired {
            print("已经过期")
            account = nil
        }
    }
}


// MARK: - 用户账户相关的网络方法

extension XKUserAccountViewModel {
    
    ///  加载token
    ///
    ///  - parameter code:    <#code description#>
    ///  - parameter flashed: <#flashed description#>
    func loadAccessToken (code:String, flashed:(isSuccessed:Bool)->()) {
    // 1. 加载accessToken , 发送请求
    NetworkTools.sharedTools.loadToken(code) { (result, error) -> () in
    // 1.判断错误
    if error != nil {
        //成功后执行回调
        print("我是error")
        flashed(isSuccessed: false)
    return
    }
    
    // 2.输出结果
    self.account = XKUserAccount(dict: result as! [String: AnyObject])

    
    // 3.加载用户信息
        self.loadUserInfo(self.account!, flashed:flashed)
    }

    }
    
    // MARK: - 加载用户信息
    private func loadUserInfo (account:XKUserAccount, flashed:(isSuccessed:Bool)->()) {
        print(account)
        NetworkTools.sharedTools.loadUserInfo(account.uid!) { (result, error) -> () in
            //            print(result)
            if error != nil {
                print("加载用户出错了")

                flashed(isSuccessed: false)
                return
            }
            
            // 判断result 一定有值, 一定是字典
            guard let dict = result as? [String:AnyObject] else {
                print("格式错误")
                flashed(isSuccessed: false)
                return
            }
            
            // 给模型数据赋值
            account.screen_name = dict["screen_name"] as? String
            account.avatar_large = dict["avatar_large"] as? String
            
            // 成功后完成回调
            flashed(isSuccessed: true)

//            account.saveAccount()
            NSKeyedArchiver.archiveRootObject(account, toFile: self.accountPath)
            print(account)
        }
    }
    
}











